package com.mazaiting.instructions.extended;

import cn.hutool.core.util.ObjectUtil;
import com.mazaiting.instructions.base.BranchInstruction;
import com.mazaiting.rtda.MtFrame;
import com.mazaiting.rtda.MtObject;

/**
 * 根据引用是否是null进行跳转，ifnull和ifnonnull指令把栈顶的引用弹出
 *
 * @author mazaiting
 * @since 2021/8/15
 */
public class IfNullInstruction {

    /**
     * 根据引用是否是null进行跳转，ifnull和ifnonnull指令把栈顶的引用弹出
     */
    public static class IfNull extends BranchInstruction {
        @Override
        public void execute(MtFrame frame) {
            MtObject ref = frame.getOperandStack().popRef();
            if (ObjectUtil.isNull(ref)) {
                branch(frame, offset);
            }
        }
    }

    /**
     * 根据引用是否是null进行跳转，ifnull和ifnonnull指令把栈顶的引用弹出
     */
    public static class IfNonNull extends BranchInstruction {
        @Override
        public void execute(MtFrame frame) {
            MtObject ref = frame.getOperandStack().popRef();
            if (ObjectUtil.isNotNull(ref)) {
                branch(frame, offset);
            }
        }
    }
}
